package com.liming.product.client;

import com.liming.common.pojo.dto.product.AddProductDTO;
import com.liming.common.pojo.dto.product.MiniProductPageQuery;
import com.liming.common.pojo.dto.product.ProductPageQuery;
import com.liming.common.pojo.dto.product.UpdateProductDTO;
import com.liming.common.pojo.dto.stock.StockPageQuery;
import com.liming.common.pojo.entity.product.Product;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.product.ProductPriceVO;
import com.liming.common.pojo.vo.product.openfeign.FeignMiniProductDetailVO;
import com.liming.common.pojo.vo.product.openfeign.FeignMiniProductVO;
import com.liming.common.pojo.vo.product.openfeign.FeignProductVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * @author liming
 * @date 2025/1/6
 */
@FeignClient(value = "product-service", contextId = "productClient", path = "/service/product")
public interface ProductClient {

    /**
     * 商品分页 - 根据查询参数
     *
     * @param query 查询参数
     * @return 商品分页（Feign）
     */
    @GetMapping
    PageVO<FeignProductVO> page(@SpringQueryMap ProductPageQuery query);

    /**
     * 获取商品信息
     *
     * @param id 商品ID
     * @return 商品信息（Feign）
     */
    @GetMapping("{id}")
    FeignProductVO get(@PathVariable Long id);

    /**
     * 根据商品名称模糊查询商品ID
     *
     * @param name 商品名称
     * @return 商品ID列表
     */
    @GetMapping("productIdsByLikeName")
    Map<Long, Product> productIdsByLikeName(@RequestParam String name);

    /**
     * 获取商品价格
     *
     * @param id 商品ID
     * @return 商品价格（Feign）
     */
    @GetMapping("price/{id}")
    ProductPriceVO getPrice(@PathVariable Long id);

    /**
     * 获取Map 商品 - 价格
     *
     * @param productIds 商品ID列表
     * @return Map
     */
    @PostMapping("priceMap")
    Map<Long, Integer> idAndPriceMap(@RequestBody List<Long> productIds);

    /**
     * 商品列表 - 根据ID列表
     *
     * @param ids ID列表
     * @return 商品列表（Feign）
     */
    @PostMapping("listByIds")
    List<FeignProductVO> listByIds(@RequestBody List<Long> ids);

    /**
     * 新增商品
     *
     * @param addProductDTO 新增商品参数
     * @return 是否新增成功
     */
    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    Boolean add(@RequestBody AddProductDTO addProductDTO);

    /**
     * 根据excel批量导入商品
     *
     * @param file excel文件
     * @return 是否导入成功
     */
    @PostMapping(value = "importProduct", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    Boolean importProduct(@RequestPart MultipartFile file);

    /**
     * 更新商品
     *
     * @param updateProductDTO 更新商品参数
     * @return 是否更新成功
     */
    @PutMapping(consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    Boolean update(@RequestBody UpdateProductDTO updateProductDTO);

    /**
     * 更新商品上架状态
     *
     * @param id 商品ID
     * @return 是否更新成功
     */
    @PutMapping("{id}")
    Boolean updateOnShelf(@PathVariable Long id);

    /**
     * 删除商品
     *
     * @param id 商品ID
     * @return 是否删除成功
     */
    @DeleteMapping("{id}")
    Boolean delete(@PathVariable Long id);

    /**
     * 批量删除商品
     *
     * @param ids 商品IDS
     * @return 是否删除成功
     */
    @DeleteMapping
    Boolean deleteBatch(@RequestBody List<Long> ids);

    /**
     * 根据库存查询参数 查询商品ID
     *
     * @param query 库存查询参数
     * @return 商品ID列表
     */
    @GetMapping("idsStockQuery")
    List<Long> productIdsByStockQuery(@SpringQueryMap StockPageQuery query);

    /**
     * 30天未售出商品数量
     *
     * @return 滞销商品数量
     */
    @GetMapping("stagnantProductCount")
    List<FeignProductVO> stagnantProductCount();

    /**
     * 推荐商品
     *
     * @return 推荐商品列表
     */
    @GetMapping("recommend")
    List<FeignMiniProductVO> recommendProduct();

    /**
     * 商品详情 - 小程序
     *
     * @param id 商品id
     * @return 商品详情
     */
    @GetMapping("detail/{id}")
    FeignMiniProductDetailVO miniDetail(@PathVariable Long id);

    /**
     * 商品分页 - 小程序
     *
     * @param query 查询参数
     * @return 商品分页
     */
    @GetMapping("miniPage")
    PageVO<FeignMiniProductVO> miniPage(@SpringQueryMap MiniProductPageQuery query);

    /**
     * 根据商品ID查询品牌和分类ID
     *
     * @param keyIdList 商品ID列表
     * @return Map
     */
    @PostMapping("brandAndCategoryIdsMapByProductIds")
    Map<Integer, List<Long>> brandAndCategoryIdsMapByProductIds(@RequestBody List<Long> keyIdList);

    /**
     * 增加商品销售数量
     *
     * @param productIdAndQuantity Map<商品ID，商品销售数量>
     * @return 是否增加成功
     */
    @PutMapping("increaseSalesByMap")
    Boolean increaseSalesByMap(@RequestBody Map<Long, Integer> productIdAndQuantity);

    /**
     * 更新商品销售时间
     *
     * @param productIds 商品ID列表
     */
    @PutMapping("updateSalesTimeByIds")
    void updateSalesTimeByIds(@RequestBody List<Long> productIds);
}
